package com.bing.springboot.config;

import com.bing.springboot.bean.Car;
import com.bing.springboot.bean.Monster;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author 徐
 * @version 1.0
 * @Configuration(proxyBeanMethods = false)
 * 表示是配置类
 * Lite模式
 * proxyBeanMethods = false 非代理的方式，
 * 每个@Bean方法被调用多少次返回的组件都是新创建的
 */
@Configuration(proxyBeanMethods = false)
public class WebConfig {

    //注入bean WebMvcConfigurer
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){

        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                /**
                 *老师解读
                 *1．在addFormatters 方法中，增加一个自定义的转换器
                 *2．增加自定义转换器 String → Car
                 *3．增加的自定义转换器会注册到 converters 容器中
                 *4． converters 底层结构是 ConcurrentHashMap 内置有124转换器
                 *5．一会老师会使用debug来看到这些转换器
                 */
//                registry.addConverter(new Converter<String, Car>() {
//                    @Override
//                    public Car convert(String source) {//source就是传入的字符串 碧水金晶兽,66
//                        //这里就加入自定义的转换业务代码
//                        if (!ObjectUtils.isEmpty(source)){
//                            Car car = new Car();
//                            String[] split = source.split(",");
//                            //根据传入的字符串，赋值
//                            car.setName(split[0]);
//                            car.setPrice(Double.parseDouble(split[1]));
//                            return car;
//                        }
//                        return null;
//                    }
//                });

                //创建转换器
                Converter<String, Car> carConverter = new Converter<String, Car>() {
                    @Override
                    public Car convert(String source) {//source就是传入的字符串 碧水金晶兽,66
                        //这里就加入自定义的转换业务代码
                        if (!ObjectUtils.isEmpty(source)) {
                            Car car = new Car();
                            String[] split = source.split(",");
                            //根据传入的字符串，赋值
                            car.setName(split[0]);
                            car.setPrice(Double.parseDouble(split[1]));
                            return car;
                        }
                        return null;
                    }
                };

                //创建转换器
                Converter<String, Monster> monsterConverter = new Converter<String, Monster>() {
                    @Override
                    public Monster convert(String source) {
                        System.out.println("source= " + source);
                        return null;
                    }
                };

                //创建转换器,相同的转换器会覆盖上面的转换器 carConverter,会执行此转换器
//                Converter<String, Car> carConverter2 = new Converter<String, Car>() {
//                    @Override
//                    public Car convert(String source) {
//                        System.out.println("source= " + source);
//                        return null;
//                    }
//                };

                //还可以增加更多的转换器
                //key -[源类型->目标类型]
                registry.addConverter(carConverter);
                registry.addConverter(monsterConverter);
                //registry.addConverter(carConverter2);
            }
        };
    }

}
